home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / c68_445b.zoo / man / c68.1 next >
Encoding:
Text File  |  1995-02-01  |  47.0 KB  |  1,312 lines

  1. C68(1)              USER COMMANDS               C68(1)
  2.  
  3.  
  4. NAME
  5.  
  6.       c386/c68 - Compile pre-processed C source.
  7.  
  8.  
  9. SYNOPSIS
  10.  
  11.       c386 [options] [input_file [output_file [listing_file]]]
  12.       c68  [options] [input_file [output_file [listing_file]]]
  13.  
  14.  
  15. DESCRIPTION
  16.  
  17.       The c386/c68  programs are  publicly available C compilers.
  18.       c386/c68 support    all  language  features  defined  in  the
  19.       original    Kernighan   and  Richie   (K&R)  definition   and
  20.       additionally most  of the  extra features  that have  since
  21.       been defined  by ANSI.   The  user  can  select    K&R  mode
  22.       (which causes  many ANSI    specific features to be disabled)
  23.       or  ANSI     mode  at   run-time.    The   default    is   ANSI
  24.       compatibility mode  as this  is the  mode that  most people
  25.       would wish to use.
  26.  
  27.       The compiler  currently exists  in two major variants - one
  28.       known as    c68 which produces 68000 code and the other known
  29.       as c386  which produces 386 code (as used on top-end PC's).
  30.       The compilers  were originally  developed  to  run  on  the
  31.       MINIX operating  system, but are known to be in wide use on
  32.       other systems.
  33.  
  34.       c386/c68 take  the output of a C pre-processor, and compile
  35.       it  to  give  assembler  source.     If  no  output  file  is
  36.       specified on  the command  line then  c386/c68  writes  the
  37.       generated  assembler   code  to  standard  output.   If  in
  38.       addition there  is no  input file  specified then  c386/c68
  39.       reads the  C source  from standard input.  Finally if a run
  40.       time option  requesting a  listing is  used and  no listing
  41.       file is specified, c68/c386 writes it to standard error.
  42.  
  43.       The options  available to control the behaviour of c386/c68
  44.       are listed  below.  The  options to  c386/c68 can  also  be
  45.       passed as  -Qoption.  This  is to make it easier for the CC
  46.       front-end program  to decide  which options  belong to  the
  47.       c386/c68    program.    Not  all   options    are   necessarily
  48.       available in  all versions  of c68/c386 as some of them are
  49.       dependent on  the settings  in the  c68/c386  configuration
  50.       file at the time that c68/c386 is actually built.
  51.  
  52.       -?    Make c68/c386 display  a message  giving the full
  53.         list of  options  available  in  this  particular
  54.         version  of   c68/c386.    It  also  details  the
  55.         default  settings   for  the   parameters.   This
  56.         option can  be very  useful as it always reflects
  57.         the  choices   of  settings   in   the     c68/c386
  58.         configuration file  that were  actually used when
  59.         generating this version of c68/c386.
  60.  
  61.       -v    Output additional  information during the compile
  62.         process.   If  c68/c386 was  compiled without the
  63.         -DVERBOSE set  then  this  is  merely  a  message
  64.         giving the  version number  of the compiler.   If
  65.         the -DVERBOSE  was used  when c68/c386 was built,
  66.         then additional  progress information  is  output
  67.         during the compile process.
  68.  
  69.         Default:  c386/c68  as supplied  is not  normally
  70.               built with  the  -DVERBOSE  option  and
  71.               merely  provides   the  version  number
  72.               message if -v is used.
  73.  
  74.       -warn=n    Control  the   severity  level     of  warning  and
  75.         diagnostic messages  that will    be output  during
  76.         the compilation  process.  Messages with a higher
  77.         severity value    (i.e. less severe) than the value
  78.         specified will    not be    output.   See  later  for
  79.         more  information   on    the  effect  of  possible
  80.         values for n.
  81.  
  82.         Default:  -warn=3
  83.  
  84.       -error=n    Make messages that  are normally only warnings to
  85.         be treated  as errors  instead.  The  value of    n
  86.         specifies what    severity of  messages that  would
  87.         normally be  only  warnings  are  instead  to  be
  88.         treated as  errors.  This option is often used in
  89.         conjunction with the maxerr option..
  90.  
  91.         Default:  -error=0
  92.  
  93.       -maxerr=n Sets the maximum error    count to  the value of n.
  94.         This is  the maximum  number of  errors that will
  95.         be reported  before c386/c68  abandons a compile.
  96.         As one    error can  cause others  to occur,  in    a
  97.         cascade effect,  it is    often a  good idea to set
  98.         this to a low value in the region of 10-20.
  99.  
  100.         Default:  -maxerr=200
  101.  
  102.       -g    Output    additional   information  for    debugging
  103.         purposes.    Branch    optimisation    is    also
  104.         suppressed  even   if  the  -O    option    has  been
  105.         specified.   Currently    this  option  has  little
  106.         other effect  except to  add line  directives  to
  107.         the generated  assembler output.   This can still
  108.         be useful  if you  wish to  see exactly  which    C
  109.         source lines  caused particular assembler code to
  110.         be generated.
  111.  
  112.         Default:  No debugging information is generated.
  113.  
  114.       -O    Specifies that    maximum branch    code optimisation
  115.         is to  be used.   This can  significantly  reduce
  116.         the  size  of  the  generated  code  with  little
  117.         penalty on  run time.  It can, however, slow down
  118.         the compilation  process.  This option is ignored
  119.         if the -g or -noopt options are specified.
  120.  
  121.         Default:  The    optimisation  triggered  by  this
  122.               option is not performed.
  123.  
  124.       -align    ** STILL UNDER DEVELOPMENT - USE WITH CAUTION **
  125.       -noalign    Align structures and  unions using the same rules
  126.         as applied  to the  member that has the strictest
  127.         alignment rules.
  128.         Default:  -align    for c386
  129.               -noalign  for c68
  130.  
  131.       -code    Specifies whether code is to be generated, or if
  132.       -nocode    this run  is  merely  being  used  to  check  for
  133.         errors in  the source  code.   The  advantage  of
  134.         specifying the    -nocode option    if you are merely
  135.         looking for  errors is    that  c68/c386    will  run
  136.         faster if no attempt is made to generate code.
  137.  
  138.         Default:  -code
  139.  
  140.       -extern    This causes details of external symbols in this
  141.       -noextern module to be  output to the listing device.  This
  142.         is intended  in the  future to    provide the basis
  143.         of a  lint-style facility to provide cross-module
  144.         consistency checking.
  145.  
  146.         Default:  -noextern
  147.  
  148.       -format    Activate additional checks for the 'printf' and
  149.       -noformat 'scanf'  families   of    library   routines.    If
  150.         active, then  the parameters following the format
  151.         string are  checked as    being compatible with the
  152.         format string.
  153.  
  154.         Default:  -format          (check parameters)
  155.  
  156.       -fpu    [c386 only]
  157.       -nofpu    Generate floating  point code  in a form suitable
  158.         for direct  execution by  a maths co-processor if
  159.         -fpu is  used.    If  -nofpu is  used instead, then
  160.         calls  are   made  instead   to  library  support
  161.         routines. This    allows for  software emulation of
  162.         floating point    to be  provided (although this is
  163.         not part of this release of c386).
  164.  
  165.         Default:  -fpu
  166.  
  167.       -frame=n    [c68 only]
  168.         Specify which address  register is  to be used as
  169.         the frame  pointer.   C68  will then  not use for
  170.         any purposes  any registers  with numbers  larger
  171.         than the frame register and less than A7.
  172.  
  173.         Default:  -frame=6
  174.  
  175.       -icode    Output    run-time  debugging  information  to  the
  176.         listing file.    Intended mainly for debugging the
  177.         compiler itself.   This option    is only available
  178.         if  c386/c68   was  compiled   with  the  -DICODE
  179.         option.
  180.  
  181.         Default:  c386/c68  as supplied  is  not  set  to
  182.               have this option compiled in.
  183.  
  184.       -lattice    Older versions of Lattice C had partial support
  185.       -nolattice of  prototypes in  which a  variable  number  of
  186.         parameters  was   indicated  by   finishing   the
  187.         parameter list    with a    comma  (rather    than  the
  188.         ANSI style  of using  ,...).   The  use  of  this
  189.         option means  the Lattice  syntax  will  also  be
  190.         accepted.
  191.  
  192.         Default:  -nolattice
  193.  
  194.       -list    Control  listing  of  source file  being compiled
  195.       -nolist    (the pre-processor output!).   Any  listing  will
  196.         be put    into the  listing  file.   Any    error  or
  197.         warning messages  are included at the appropriate
  198.         point in the listing.
  199.  
  200.         Default:  -nolist
  201.  
  202.       -longdouble    If active, then 'long double' is  treated as
  203.       -nolongdouble  being a distinct  type  from  'double'  with
  204.         different support routines.
  205.  
  206.         Default:  -nolongdouble
  207.  
  208.         NOTE: The support  routines for 'long double' are
  209.               not  currently   available  for    use  with
  210.               c386/c68.  This  routine    is  included  for
  211.               future compatibility.
  212.  
  213.       -obsolete   Specifies whether warnings should be generated
  214.       -noobsolete if  you use an option that is currently part of
  215.         the  ANSI   C  standard,   but    which    the  ANSI
  216.         committee have    warned may be removed from future
  217.         versions of  the ANSI  C standard.   Examples  of
  218.         this  is   support   for   K&R     style     function
  219.         definitions.
  220.  
  221.         Default:  -noobsolete           (no warnings)
  222.  
  223.       -opt    Control the operation of the peephole optimiser.
  224.       -noopt    Normally  the    peephole  optimiser  is  used  to
  225.         produce more  efficient code.    If  you  wish  to
  226.         suppress it  you can  specify the  -noopt option.
  227.         You would  not normally  use this  option  unless
  228.         you suspect  an error  in the peephole optimiser.
  229.         Using the  -noopt option  will    override  the  -O
  230.         option if it is also specified.
  231.  
  232.         Default:  -opt
  233.  
  234.       -packenum ** STILL UNDER DEVELOPMENT - USE WITH CAUTION **
  235.       -nopackenum Use  the smallest  integer type that is capable
  236.         of containing  all the    enumeration  values  that
  237.         are defined  for a  particular enumeration  type.
  238.         If -nopackenum    is in  effect then  'int' is used
  239.         as the enumeration type.
  240.  
  241.         Default:  -nopackenum
  242.  
  243.       -probe    Generate stack probes? These are needed if using
  244.       -noprobe    the compiler in  a multi-tasking  environment and
  245.         with a    68000.    The  problem is  that not  enough
  246.         information is    saved on  the stack for a restart
  247.         of an  instruction, and  stack probes insure that
  248.         the  stack   has  enough   allocated  memory   to
  249.         accomidate the    needs  of  the    routine.   Things
  250.         like this  are used  on  such  computers  as  the
  251.         Tandy 6000/TRS-80  16[ab] and  some *other  68000
  252.         based unix boxes.
  253.  
  254.         Default:  -noprobe
  255.  
  256.         Note: c386/c68 as  supplied is    not set  to  have
  257.               this option compiled in.
  258.  
  259.       -reg    Control whether c386/c68 can allocate variables
  260.       -noreg    to registers.  Normally  c386/c68 will    try to do
  261.         automatic allocation  of variables  to    registers
  262.         according to  their run-time  usage.  The  -noreg
  263.         option forces  the use of register variables only
  264.         when explicitly requested by the programmer.
  265.  
  266.         Default:  -reg
  267.  
  268.       -revbit    Control the order  in which c386/c68 allocate the
  269.         bits in  a bitfield.   The -revbit  option causes
  270.         the bitfield  to be  allocated starting  from the
  271.         highest number    bit downwards,    rather    than  the
  272.         default of allocating them from bit 0 upwards.
  273.  
  274.         Default:  bitfields start at bit 0
  275.  
  276.       -separate   Used to force c386/c68 to allocate strings  and
  277.       -noseparate  constants   in  the     data  segment.    Unless
  278.         -separate  is    used they  are allocated  in  the
  279.         same segment as the generated code.
  280.  
  281.         Default:  -noseparate
  282.  
  283.       -short    Control the length of int declarations as either
  284.       -noshort    16 or 32 bit.  There  is a  lot  of  code  around
  285.         that assumes  sizeof(int)==sizeof(char *), so use
  286.         16 bit ints with care.
  287.  
  288.         Default:  c386:     -noshort
  289.               c68:        -short    (MINIX/TOS systems)
  290.                     -noshort  (QDOS/SMS systems)
  291.  
  292.       -stackcheck    Used to specify that calls should be made
  293.       -nostackcheck  to a support  routine   to   perform   stack
  294.         checks at  the start  of each  function.  To  use
  295.         this option,  it is necessary to have implemented
  296.         the  appropriate   (system   dependent)   support
  297.         routine.
  298.  
  299.         Default:  -nostackcheck
  300.  
  301.       -stackopt      Used to control whether the 'lazy stack
  302.       -nostackopt    updating' optimisation  is to  be used.  See
  303.         later in  the discussion  on optimisation for the
  304.         implications.
  305.  
  306.         Default:  -nostackopt
  307.  
  308.       -trace    Output run-time  trace information.   Intended in
  309.         the  future   to  help     support  a  source  code
  310.         debugger.    However,     at   the   moment   this
  311.         capability is  incomplete.  This  option is  only
  312.         available  if  c386/c68  was  compiled    with  the
  313.         -DTRACE option.
  314.  
  315.         Default:  c386/c68  as supplied  is  not  set  to
  316.               have this option compiled in.
  317.  
  318.       -trad    Make the  compiler   reject  most   of    the  ANSI
  319.         extensions to  the original  K&R definition.  For
  320.         more  detail   on  what   ANSI    options  are  not
  321.         supported  when  this  option  is  set,  see  the
  322.         section   later   in   this   document     on   K&R
  323.         Compatibility Mode.
  324.  
  325.         Default:  ANSI compatibility mode is used.
  326.  
  327.       -trans    Make certain all  names in  the assembler  output
  328.         are  only  8  characters  in  length  (a  special
  329.         algorithm is  used for names that are longer than
  330.         this).    This  is  used    if  the  assembler  phase
  331.         cannot handle long C names.
  332.  
  333.         Default:  c386/c68  as supplied  is  not  set  to
  334.               have this option compiled in.
  335.  
  336.       -trap    [TOS c68 only]
  337.       -notrap    Generate trap instructions for OS calls gemdos(),
  338.         xbios() and  bios().  This is not only faster but
  339.         also implies somewhat shorter code.
  340.  
  341.         Default:  -notrap
  342.  
  343.       -uchar    Specifies that the char data type is considered
  344.       -nouchar    as an unsigned    integer  type.     Normally  it  is
  345.         treated as  a signed  integer type with the range
  346.         +127 to -128.
  347.  
  348.         Default:  -nouchar           (signed char)
  349.  
  350.       It is  possible to  generate versions of c68/c386 that have
  351.       a support  for cross-compilation or alternative assemblers.
  352.       If these    options were  specified  when  building  c68/c386
  353.       then the    following additional  run-time    options  will  be
  354.       available:
  355.  
  356.       -ack68k    Generate  68000  code.     Use  the  ACK    assembler
  357.         syntax for the output.
  358.  
  359.       -jas68k    Generate  68000  code.   Use  the  JAS  assembler
  360.         syntax (of SozobonX) for the output.
  361.  
  362.       -cpm68k    Generate  68000   code.   Use    the   CPM   68000
  363.         assembler syntax for the output.
  364.  
  365.       -gas68K    Generate  68000  code.     Use  the  GNU    assembler
  366.         syntax for the output.
  367.  
  368.       -bas396    Generate 386  code.   Use  the    sytax  for  Bruce
  369.         Evan's 386 assembler for the output.
  370.  
  371.       -gas386    Generate 386  code.  Use  the GNU  386    assembler
  372.         syntax for the output.
  373.  
  374.       -sysv386    Generate 386  code.  Use  the Unix SVR4 assembler
  375.         syntax for the output.
  376.  
  377.  
  378. EXIT CODES
  379.  
  380.       The c386/c68 program returns the following error codes:
  381.  
  382.       0    The compilation was    successful. That  is  the  source
  383.        file was compiled, and there were no fatal errors.
  384.       1    One or more fatal compilation errors were reported.
  385.       2    The source file was not found.
  386.  
  387.  
  388. EXPLOITING COMPILER OPTIMISATIONS
  389.  
  390.       This  section   discusses  the  optimisation  methods  used
  391.       within the  compiler and    how you can code to exploit these
  392.       to maximum advantage.
  393.  
  394.       The philosophy  that was    used when developing the compiler
  395.       was  to    try  and   strike  a  good  balance  between  the
  396.       efficiency of  the optimisations    that  are  done  and  the
  397.       code/runtime penalties  of doing    the opimisations  in  the
  398.       first place.
  399.  
  400.       The decision  was made  to limit the optimisations that are
  401.       will be  done to    those that  can be  done by  pure  static
  402.       analysis of  the generated  code.  More  complex methods of
  403.       optimistion have    been avoided.     The result  has  been    a
  404.       family of  compilers that  produce  suprisingly  good  code
  405.       without  too   much  penalty   in  the   runtime    size   or
  406.       performance of the compilers.
  407.  
  408.       To understand  some of  the following sections, you have to
  409.       realise that  the code  generation of  the compiler happens
  410.       in two basic stages:
  411.  
  412.       a)   Generic code is  generated that  will work  under  all
  413.        situations.    No  consideration is  given at this stage
  414.        as to  whether the  particular values of operands mean
  415.        that shorter  variants of  instructions could be used.
  416.        At  this   stage  the   following  optimisations   are
  417.        performed:
  418.  
  419.         - Allocating variables to registers
  420.         - Removing redundant stack upates.
  421.  
  422.       b)   The peephole optimiser  is invoked  that looks  at the
  423.        generated code  to see  how it  can be  improved.  The
  424.        optimisations that occur at this stage are:
  425.  
  426.         - Choosing optimum code sequences.
  427.         - Commoning up repeated code sequences
  428.         - Eliminating redundant or unecessary code.
  429.  
  430.       The programmer  can often  increase  the    effectiveness  of
  431.       these    optimisation    processes    by      writing    code
  432.       aprropriately.
  433.  
  434.       Allocating Variables to Registers
  435.  
  436.       The compiler  will try  and optimise  the use of registers.
  437.       You can  stop this  automatic allocation    of  variables  to
  438.       register    by   using  the  -noreg  runtime  option  to  the
  439.       compiler.
  440.  
  441.       The compiler  first allocates  any variables  for which the
  442.       programmer has  explicitly used  the keyword  register, and
  443.       then (assuming  there are  still free  registers) allocates
  444.       further variables  to registers  using  an  algorithm  that
  445.       looks at    how frequently    they are referenced in the source
  446.       program.     This  algorithm considers  variables as suitable
  447.       for holding  in registers  if they  are  referenced  enough
  448.       times so    that the  overhead of loading them into registers
  449.       is less  than the  gains in  code generation size of having
  450.       them in registers.
  451.  
  452.       This results in the following tips:
  453.  
  454.       a)   Avoid using the  register keyword  unnecessarily.  The
  455.        built  in   algorithms  for    allocating  variables  to
  456.        registers  are  very  good,    and  often  will  achieve
  457.        better results than the programmer.
  458.  
  459.       b)   Consider assigning  variables used in loops explicitly
  460.        with  the   register  keyword.   Because  only  static
  461.        analysis techniques    are used,  the compiler optimises
  462.        for    space,     and  may   not  realise   the    run  time
  463.        performance advantage  of keeping  loop  variables  in
  464.        registers  (albeit  possibly at the cost of increasing
  465.        code size).
  466.  
  467.  
  468.       Removing Redundant Stack Updates        "Lazy stack updates"
  469.  
  470.       If  there  are  several  calls  to  functions  without  any
  471.       intervening transfers  of control,  then the  compiler  can
  472.       accumulate the  stack tidying operations normally performed
  473.       after such  calls and  do them  all at  as late  a stage as
  474.       possible.    This   means   that     multiple   small   stack
  475.       adjustments can  be replaced  by a  single larger  one  (or
  476.       even sometimes  not do  it at  all if the end of a function
  477.       is reached  first).  This optimisation results therefore in
  478.       both size and speed gains.
  479.  
  480.       This optimisation  would, however,  cause problems  on  any
  481.       assembler routine that directly  manipulates the stack.  It
  482.       is  therefore   automatically  suppressed   for  calls   to
  483.       alloca() or  for any  routine whose  name  begins  with  an
  484.       underscore.
  485.  
  486.       As  the  effects    of  this  optimisation    going  wrong  are
  487.       extremely  hard    to  track   down,  this  option  is  only
  488.       activated if  explicitly requested  by using  the -stackopt
  489.       runtime option to the compiler.
  490.  
  491.  
  492.       Choosing Optimum Code Sequences
  493.  
  494.       This optimisation  is simply  a case  of examining the code
  495.       generated looking  for common  code sequences  that can  be
  496.       replace by  faster and/or  shorter  ones.   This    level  of
  497.       optimisation can    be disabled  by using the -noopt keyword.
  498.       However, there  is normally litte to gain by disabling this
  499.       optimisation unless  you suspect    an error as it has little
  500.       detrimental  effect on compilation speed.
  501.  
  502.  
  503.       Commoning up repeated code sequences
  504.  
  505.       The compiler  will attempt  to common up repeated sequences
  506.       of code  within a function.  This can result in significant
  507.       reduction in  code size.    However, as this optimisation can
  508.       impose  a  significant  time  penalty  on  the  compilation
  509.       process, it  is only  invoked if    the -O    runtime option is
  510.       supplied to the compiler.
  511.  
  512.       To maximise  the potential  gains that  will be achieved by
  513.       this optimisation the following tips may be useful:
  514.  
  515.       a)   Try and ensure that    the code  sequences leading up to
  516.        return statements  or break statements within a switch
  517.        construct are  the same.  This will allow the compiler
  518.        to only  generate the  code    once  and  implement  all
  519.        repeated occurences    of such  code as  simple branches
  520.        to the first one.
  521.  
  522.       b)   If you have such  sequences that  simply dffer  by one
  523.        variable,  then   it  may   be  worth  assigning  that
  524.        variable to    a temporary  one and  using that  if as a
  525.        result a larger sequence of code is common.
  526.  
  527.  
  528.       Removing Redundant or Unrefereced Code
  529.  
  530.       This optimisation  is done only if the -O runtime option to
  531.       the compiler  was used.     It looks  for any  code sequence
  532.       that cannot  be reached.     If the  code in  question was    a
  533.       direct result  of the  way the  programmer wrote the source
  534.       code then,  if leve  4  warnings    are  active,  appropriate
  535.       warning messages    will be output.   However, this situation
  536.       can also    arise as  result  of  the  effects   of  previous
  537.       stages in the optimisation process.
  538.  
  539.  
  540. ERROR AND WARNING LEVELS
  541.  
  542.       The errors  and warnings    within    c386/c68  are  classified
  543.       into various  severity levels.    The higher the level, the
  544.       more pedantic  the level    of messages  that are output.  By
  545.       default all  messages with  severity 0  are errors, and all
  546.       those with  higher levels  are merely  warnings.    The -warn
  547.       and -error  parameter options  allow the    user to  vary the
  548.       default treatment of these levels.
  549.  
  550.       c386/c68 is  supplied with  warning  level  3  set  as  the
  551.       default warning  level (if not changed via the command line
  552.       or in  an environment  variable).  It  is good  practice to
  553.       try and  write code  that compiles without warnings even at
  554.       levels 4    or 5.    There are  then less  likely to be subtle
  555.       bugs lurking  in your  code that    are coding  mistakes that
  556.       are difficult to spot.
  557.  
  558.       The levels currently supported are as follows:
  559.  
  560.       0    Messages at this  level are    always    errors.   If  you
  561.        specify this  as a warning level, then effectively all
  562.        warning messages are disabled.
  563.  
  564.       1    These are severe  warnings that should not normally be
  565.        suppressed.     They  typically relate  to  problems  at
  566.        the code generation stage of the compiler.
  567.  
  568.       2    These relate to  problems with  the code that normally
  569.        indicate problems  or potential  problems.    They  are
  570.        typically easy  to fix  - normally by adding a cast or
  571.        something similar.
  572.  
  573.       3    This level  relates    to  warnings  that  are  commonly
  574.        encountered when  porting code.   The warnings at this
  575.        level may  not indicate  an    error,    but  they  should
  576.        certainly be checked out.
  577.  
  578.       4    This level of  warning  indicates  problems    that  are
  579.        often encountered  in porting,  but that  are probably
  580.        not an  error.   It    is still  a good idea to get your
  581.        own code  to compile  cleanly at this level of warning
  582.        as it will minimise problems later.
  583.  
  584.       5.   This level  of   warning  is   for  short   cuts  that
  585.        experienced C  programmers often  use,  but    that  are
  586.        occasionally done  in error.   You are  most likely to
  587.        find this  level useful  when trying  to track down an
  588.        error that  you are    having trouble    locating.  It  is
  589.        good practice  to write code that is warning free even
  590.        at this level.
  591.  
  592.       6    This is the most  pedantic level.   It  will  only  be
  593.        useful to  those who  are  looking  for  very  awkward
  594.        porting problems.
  595.  
  596.       A detailed  list of the error and warning messages that can
  597.       be output is given later.
  598.  
  599.  
  600. ENVIRONMENT VARIABLES
  601.  
  602.       The Environment  Variables C386 or C68 (as appropriate) are
  603.       checked to  see if  they are present, and if so are assumed
  604.       to contain  options in  the same format as the command line
  605.       options.     This  is  done  before  processing  the  command
  606.       line.  Command  line options  will therefore  over-ride the
  607.       Environment variable settings in the event of conflict.
  608.  
  609.       The Environment  Variable method    is a  very convenient way
  610.       of setting defaults such as the warning level.
  611.  
  612.  
  613. ANSI FEATURES NOT SUPPORTED
  614.  
  615.       The following  features specified  in the ANSI standard are
  616.       NOT supported
  617.  
  618.       -    Trigraphs.  It  is possible,  however, that you have a
  619.        pre-processor that  handles trigraphs,  in which  case
  620.        this  is  done  there  rather  than    in  the  c386/c68
  621.        program.
  622.  
  623.       -    Multi-Byte  and   wide  characters    are   not   fully
  624.        supported.  The  syntax is accepted, but treated as if
  625.        of type char.
  626.  
  627.  
  628. CHANGES TO FEATURES IN K&R COMPATIBILITY MODE
  629.  
  630.       If K&R  compatibility mode  is specified by using the -trad
  631.       run-time option,    then the  following changes  occur in the
  632.       features supported by c68/c386:
  633.  
  634.       -    The long double qualifier is not allowed.
  635.  
  636.       -    The use of the  long float  qualifier as a synonym for
  637.        double is permitted.
  638.  
  639.       -    The const keyword is not allowed.
  640.  
  641.       -    The volatile keyword is not allowed.
  642.  
  643.       -    The signed keyword is not allowed.
  644.  
  645.       -    String concatenation is not performed.
  646.  
  647.       -    Single copies of  identical strings are not generated.
  648.        Instead separate  copies will  be generated every time
  649.        a string is used.
  650.  
  651.       -    ANSI style function prototypes are not allowed.
  652.  
  653.       -    ANSI style function declarations are not allowed.
  654.  
  655.  
  656. ERROR AND WARNING MESSAGES
  657.  
  658.       The following  is a  list of the error messages that can be
  659.       output by  the compiler.     In most  cases the  messages are
  660.       self-explanatory, but  where this  is  not  so,  additional
  661.       information is  given about the possible cause of the error
  662.       message.
  663.  
  664.       Where  variable    information  can  be  inserted    into  the
  665.       message, then  this has  been specified  using  the  printf
  666.       format string method.
  667.  
  668.       LEVEL 0
  669.  
  670.       This level  of message  is always  an error.    It  is  not
  671.       possible to  make c68/c386  treat such  messages merely  as
  672.       warnings.
  673.  
  674.       "& operator may not be applied to bitfields"
  675.  
  676.       "& operator on register variable '%s'"
  677.        The ANSI standard does  not allow the & operator to be
  678.        used on  variables that  have been  qualified with the
  679.        register keyword.
  680.       "{ expected on initializer"
  681.        If you are initialising  a complex  structure such  as
  682.        an array  or structure, then the initialisation values
  683.        should be enclosed in braces.
  684.  
  685.       "an object type expected"
  686.  
  687.       "arithmetic type expected"
  688.  
  689.       "attempt to modify 'const' value"
  690.  
  691.       "break not allowed here"
  692.  
  693.       "cannot nest function definition '%s()'"
  694.  
  695.       "cannot subtract a pointer from an integral value"
  696.  
  697.       "case not allowed here"
  698.  
  699.       "character constant unterminated or too long"
  700.  
  701.       "constant expression expected"
  702.  
  703.       "constant expression exceeds representable range"
  704.  
  705.       "constant integer expression expected"
  706.  
  707.       "continue not allowed here"
  708.  
  709.       "declared argument '%s' missing"
  710.  
  711.       "duplicate case label 'case %ld'"
  712.  
  713.       "duplicate default label in case"
  714.  
  715.       "duplicate label '%s'"
  716.  
  717.       "error casting a constant"
  718.  
  719.       "error dereferencing a pointer"
  720.  
  721.       "error doing a cast"
  722.  
  723.       "error while scanning a parameter list"
  724.        This implies  that    the  compiler    has   encountered
  725.        something unexpected  while scanning a parameter list.
  726.        It is  commonly caused  by a  misplaced  comma,  or    a
  727.        misspelt type keyword.
  728.  
  729.       "expression expected"
  730.  
  731.       "floating point constant expected"
  732.  
  733.       "function body expected"
  734.  
  735.       "function declarator not allowed here"
  736.  
  737.       "function returning array type"
  738.  
  739.       "function type expected"
  740.  
  741.       "function '%s' declared but never defined"
  742.        This will occur  if you  put a forward declaration for
  743.        a function  in a  file, and    then  never  define  that
  744.        function.   It  could  also    occur  if  you    meant  to
  745.        forward declare  a library  function, but  omitted the
  746.        'extern' storage class specifier.
  747.  
  748.       "function '%s()' default promotion / prototype mismatch"
  749.        This is typically  caused   by  mixing  ANSI  and  K&R
  750.        methods of function declaration and definition.
  751.  
  752.        This is of  particular importance  for functions which
  753.        have parameters  of types  'char', 'short'  or 'float'
  754.        as the  parameter promotion    rules for these types are
  755.        different  for   K&R   and    ANSI   declarations   and
  756.        definitions.
  757.  
  758.       "function '%s()' prototype mismatch"
  759.        This indicates that    the for  the specified    function,
  760.        there are  incompatible definitions    or  declarations.
  761.        This can  be either    in  the  type  returned,  or  the
  762.        number or types of the parameters.
  763.  
  764.       "general error"
  765.        This error means  that a  consistency check within the
  766.        compiler   has    failed.      Please    report    the
  767.        circumstances that  caused the  problem,  and  ideally
  768.        provide  a    sample    of  code  that    can  be  used  to
  769.        reproduce the problem.
  770.  
  771.        It is preferable if    any  code  that  is  supplied  to
  772.        illustrate a  problem has  already been passed through
  773.        the     C    pre-processor.    This    eliminates    any
  774.        dependencies on system specific header files.
  775.  
  776.       "identifier expected"
  777.  
  778.       "identifier list not allowed on function declaration"
  779.  
  780.       "illegal cast operation"
  781.  
  782.       "illegal character '%c'"
  783.  
  784.       "illegal constant integer expression"
  785.  
  786.       "illegal field width"
  787.  
  788.       "illegal floating point constant"
  789.  
  790.       "illegal initialization"
  791.  
  792.       "illegal redeclaration of '%s'"
  793.        The function/variable has  been declared in a way that
  794.        is incompatible with an earlier use.
  795.  
  796.       "illegal 'sizeof' operation"
  797.  
  798.       "illegal storage class"
  799.  
  800.       "illegal type combination"
  801.  
  802.       "illegal unprintable character (value=0x%x)"
  803.  
  804.       "implicit conversion to pointer on register variable '%s'"
  805.  
  806.       "incomplete '%s' declaration"
  807.  
  808.       "initialization invalid"
  809.  
  810.       "integral type expected"
  811.  
  812.       "l-value required"
  813.        A l-value is  simply an  expression which  it is legal
  814.        to have on the left side of an assignment expression.
  815.  
  816.       "no field allowed here"
  817.  
  818.       "parameter count incorrect for function %s"
  819.  
  820.       "pointer type expected"
  821.  
  822.       "problem with pre-processor output"
  823.        This indicates that    what looks  like  a  preprocessor
  824.        symbol (one    starting with  #) was found in the source
  825.        file.  This    is typically  caused  by  trying  to  use
  826.        c68/c386 raw  C source  before it has gone through the
  827.        C pre-processor.
  828.  
  829.       "qualifier already specified"
  830.        This means that  there are duplicate qualifiers of the
  831.        same type  refering to  the same  variable or function
  832.        declaration/defintion.  The    second one will simply be
  833.        ignored, but the source should be corrected.
  834.  
  835.       "return expression of type void"
  836.        It is not  possible    to  return  an    expression  which
  837.        evaluates to type void.
  838.  
  839.       "return value specified to void function"
  840.  
  841.       "scalar type expected"
  842.  
  843.       "string constant unterminated or too long"
  844.        This message may  well occur  well after  the point at
  845.        which the  string constant started.    It is quite often
  846.        caused   by      mismatched   comments   or   #if/#endif
  847.        directives.
  848.  
  849.       "too many initializers"
  850.        The number of  initializer  values  would  exceed  the
  851.        size of the variable space allocated to hold them.
  852.  
  853.       "type already specified"
  854.  
  855.       "type mismatch error"
  856.  
  857.       "type/operand has unknown size"
  858.  
  859.       "undefined identifier '%s'"
  860.  
  861.       "undefined label '%s'"
  862.  
  863.       "unexpected end of file"
  864.        This is typically caused  by a  mismatch  between  the
  865.        number of start and close braces.
  866.  
  867.       "unexpected symbol '%s' found"
  868.        This simply means  that the symbol shown was not legal
  869.        at this  point, and    the compiler  has been    unable to
  870.        specify the error more accurately.
  871.  
  872.       "value of escape sequence out of valid range"
  873.  
  874.       "void parameter is passed to function %s"
  875.  
  876.       "'%s' cannot be used as a label here"
  877.  
  878.       "'%s' is not a struct/union member"
  879.  
  880.       "'{' expected on initializer"
  881.  
  882.  
  883.       LEVEL 1
  884.  
  885.       This level  of  message  is  used  to  indicate  code  that
  886.       although allowed    by C  is extremely  bad coding    practice,
  887.       and as a result is normally not what the programmer meant.
  888.  
  889.       "bit field type should be unsigned or int"
  890.  
  891.       "#pragma ignored",
  892.        The #pragma directive  has no  special use  within the
  893.        c68/c386  compiler.      Any  lines  that  contain  this
  894.        directive are therefore simply ignored.
  895.  
  896.  
  897.       LEVEL 2
  898.  
  899.       This level  of warning  is used  to indicate  code that may
  900.       well not    be an  error.  However, experience has shown that
  901.       in reality  the code  does not  perform the action that was
  902.       intended.
  903.  
  904.       "attempt to allocate zero storage",
  905.        The data item specified is of zero size.
  906.  
  907.       "auto initialisation not reached"
  908.  
  909.       "conversion between incompatible types"
  910.        This message indicates  that the two types in question
  911.        are not  defined by    the C  standard to be compatible.
  912.        If you  really mean    the statement,    then the  message
  913.        can be suppressed by use of a suitable cast.
  914.  
  915.       "redefinition of '%s'"
  916.  
  917.       "'sizeof' value is zero"
  918.  
  919.       "'sizeof' value %d is greater than '65535'"
  920.        This will occur when  the size of a sizeof operator is
  921.        set to  be only  16 bits,  and the  result of a sizeof
  922.        operator is larger than 16 bits.
  923.  
  924.        The data type returned  by the  sizeof operator  is in
  925.        fact determined  by the  value defined  for TP_SIZE in
  926.        the configuration  file (config.h)  used when c386/c68
  927.        was compiled.   It is important that this value should
  928.        agree with  the  value  defined  for  size_t  in  your
  929.        system include files.
  930.  
  931.       "\x not followed by any hex characters"
  932.        The \x sequence that  ANSI specifies  as being used as
  933.        an escape  sequence to  introduce a    hex character was
  934.        not followed  by values  that could    be interpreted as
  935.        hex.
  936.  
  937.  
  938.       LEVEL 3
  939.  
  940.       This level  of message  indicates code that is probably not
  941.       an error,  but is  untidy.   Messages  in this category can
  942.       normally be  suppressed by  making simple  modifications to
  943.       the source code.
  944.  
  945.       "a cast from short to pointer is dangerous"
  946.        There is very rarely  much point  in storing  a 16 bit
  947.        short value    in a  pointer which is 32 bits in size as
  948.        it is  virtually guaranteed    to not    be what you meant
  949.        to do.
  950.  
  951.       "conversion between incompatible pointer types"
  952.        Very common message    when a    pointer of  one  type  is
  953.        assigned to    a pointer of a different type.    Inserting
  954.        the relevant cast will suppress this message.
  955.  
  956.       "dubious %s declaration; use tag only"
  957.        This normally means    that a structure or union pointer
  958.        has been  encountered using    a tag  which has not been
  959.        defined.
  960.  
  961.       "escape ignored in sequence '\%c'"
  962.        The character following  the \  is  not  one  that  is
  963.        supported as a valid escape sequence.
  964.  
  965.       "function '%s' declared but never defined"
  966.        This normally  means   that     there     is   a   forward
  967.        declaration for  a static  function, but that the code
  968.        defining that function is not present.
  969.  
  970.       "implicitly declared function: 'int %s()'"
  971.        This means that  there is  no declaration (either ANSI
  972.        or K&R)  in scope for this function.   If the function
  973.        is a  standard library  function, then  it means  that
  974.        the relevant header file has not been included.
  975.  
  976.  
  977.       "no value specified in 'return' statement"
  978.        This occurs when  a return  statement is  found for    a
  979.        function that  has an  implicit int    type.    It can be
  980.        suppressed by  defining the    function to  be  of  type
  981.        void.
  982.  
  983.       "qualifier inconsistent with type 'void'"
  984.        This implies a  const or  volatile qualifier  used  in
  985.        conjunction with a void type.
  986.  
  987.  
  988.       LEVEL 4
  989.  
  990.       Messages at  this level  are not    strictly speaking errors,
  991.       but they    do indicate  code that    could  be  improved.   In
  992.       particular, they    indicate code that might have portability
  993.       problems.
  994.  
  995.       "argument '%s' implicitly declared 'int'"
  996.        This means that  an argument  to a  function has  been
  997.        specified which  has not been explicitly given a type.
  998.        It has  therefore been  treated as  an int.    Declaring
  999.        the argument  type explicitly  will stop  this message
  1000.        being generated.
  1001.  
  1002.       "definition of '%s' hides an earlier definition"
  1003.        This occurs when  a variable  name is used in an inner
  1004.        block that  has the    same name as one that has a wider
  1005.        scope.  It  is just a warning that during the duration
  1006.        of the  block the  variable at the outer level will be
  1007.        inaccessible.
  1008.  
  1009.        The commonest cause    is when  the name  of a parameter
  1010.        to a  function is  the same    as that used for a global
  1011.        variable.
  1012.  
  1013.        NOTE: Due to the way    that the  compiler works, you can
  1014.          also get this warning    if you include a variable
  1015.          name (which is not  strictly speaking    required)
  1016.          in a function prototype.
  1017.  
  1018.       "empty statement"
  1019.        An empty  statement     has  been   found  following    a
  1020.        construct like an if or  while statement.
  1021.  
  1022.        There are situations  in which  this is  exactly  what
  1023.        the programmer  meant, but  it might also be due to an
  1024.        accidental semicolon being present.
  1025.  
  1026.       "extern definition '%s()' redecalred static"
  1027.  
  1028.       "implicit cast of const pointer to pointer"
  1029.  
  1030.       "K&R style function"
  1031.        This message will  only be  output  if  the    -obsolete
  1032.        runtime option  to the  compiler has been used.  It is
  1033.        a warning  that in  the future  that support  for  K&R
  1034.        style function  definitions may  be removed    from  the
  1035.        ANSI C standard.
  1036.  
  1037.       "no type specifier - add 'int'"
  1038.        This indicates that    a variable  has been  encountered
  1039.        whose type  is not  explicitly stated.    It  will  be
  1040.        defaulted to  'int' but it is much better style to put
  1041.        this in explicitly.
  1042.  
  1043.       "parameter %d to function %s() promoted to '%s'"
  1044.        This means that  the size  of a  parameter was changed
  1045.        according to  K&R promotion    rules.     This message can
  1046.        be suppressed  by having  an ANSI  style prototype  of
  1047.        function definition    in scope, or by using an explicit
  1048.        cast.
  1049.  
  1050.       "size of parameter %d changed by prototype on function %s"
  1051.        This implies that  an implicit  cast was  applied as a
  1052.        result of  a prototype  being in  scope.   Care  would
  1053.        need  to  be  taken    when  porting  such  code  to  an
  1054.        environment which  does not    have an ANSI compatible C
  1055.        compiler.
  1056.  
  1057.        It is often a  good idea  to add  an explicit  cast to
  1058.        such calls  as this    at least  makes it  clear what is
  1059.        happening, and will make code more portable.
  1060.  
  1061.       "statement not reached"
  1062.        This message means  that the  statment in  question is
  1063.        preceded  by  a  construct  that  means  program  flow
  1064.        cannot reach the statement.
  1065.  
  1066.        A typical cause  might be  code that  follows a return
  1067.        statement without  a  label.   This    can  quite  often
  1068.        happen  in    the  more  subtle  context  of    a  switch
  1069.        statement in  which all cases are terminated by return
  1070.        statements, but  there is  then code following the end
  1071.        of the switch statment.
  1072.  
  1073.       "storage specifier not at start of definition"
  1074.        The ANSI  C     standard  has    declared  that    a  future
  1075.        version  of     the   standard   may    require   storage
  1076.        specifiers  to   be    used   only  at   the  start   of
  1077.        definitions.   The  current    version  of  the  ANSI    C
  1078.        standard allows more leeway.
  1079.  
  1080.       "the use of '%s' is not allowed under strict K&R C"
  1081.        This is used to  indicate that  a construct    has  been
  1082.        used that  was not  part of the K&R specification, but
  1083.        that virtually  all modern  compilers support  even if
  1084.        they do not claim to be ANSI compatible.
  1085.  
  1086.        This message will  only be  output if  you are running
  1087.        in K&R compatibility mode.
  1088.  
  1089.       "zero-sized typedef may be changed by initialisations"
  1090.        The typedef as  written will  have zero  size, but  if
  1091.        used in  conjunction with  an initialiser  it will  be
  1092.        OK.
  1093.  
  1094.       "& operator on array ignored"
  1095.        The & operator was  used in    conjunction with an array
  1096.        name.   This   is  not  required  as  the  use  of  an
  1097.        unsubscripted array    name  implicitly  points  to  the
  1098.        first element of the array.
  1099.  
  1100.       "& operator on function ignored"
  1101.        The & operator was  specified on a function reference.
  1102.        It is not required as it is implicit.
  1103.  
  1104.       "%d expression to '?:' operator cast to void"
  1105.  
  1106.  
  1107.       LEVEL 5
  1108.  
  1109.       "'%s' has 'const' qualifier but is not initialised"
  1110.  
  1111.       "assignment in conditional context"
  1112.        This means that  there was  no conditional test found,
  1113.        so it  is possible  you put    an  assignment    when  you
  1114.        meant to  put an  equality test.   This message can be
  1115.        suppressed by  testing the  result  of  an  assignment
  1116.        against zero.
  1117.  
  1118.       "constant expression used in '%s' statement"
  1119.  
  1120.       "dangling 'else' statement"
  1121.        This is a warning that a construct of the form
  1122.  
  1123.         if (test)
  1124.              ...
  1125.         else
  1126.              if (test2)
  1127.               ...
  1128.              else
  1129.  
  1130.        has been encountered,  and it  is  possible    that  the
  1131.        last 'else'    statement is  not associated  with the if
  1132.        statement that  the programmer mean.  Use of braces to
  1133.        clarify the statement will suppress this warning.
  1134.  
  1135.       "format mistmatch with parameter %d on function %s"
  1136.        This message is  output when  checking format  strings
  1137.        for the  'printf' and  'scanf'  families  of  routines
  1138.        against the    following parameters.  This indicates the
  1139.        parameter is  not of  the type indicated by the format
  1140.        string.
  1141.  
  1142.       "ignored return value from function %s"
  1143.        This means that  you did not use the return value from
  1144.        a  function.   Inserting  a    (void)    cast  before  the
  1145.        function call will suppress this message.
  1146.  
  1147.       "label '%s' declared but not used"
  1148.        A common cause of  this  can  be  leaving  the  'case'
  1149.        keyword of  a branch  of a switch statement.  This can
  1150.        be remarkably  hard to  spot sometimes  as the code is
  1151.        still syntactically correct.
  1152.  
  1153.       "no value specified in implicit 'return' statement"
  1154.        The end of a  function definition  has been reached so
  1155.        that there  is an  implicit return.     The type  of the
  1156.        function is    not void  so in theory there should be an
  1157.        explicit return  statement  with  a    value.     However,
  1158.        much C  code is written so that the type of a function
  1159.        is defaulted  (which means  it becomes  int)  and  the
  1160.        return value  of a  function is  not used.  Explicitly
  1161.        declaring the  function type  as void  will stop  this
  1162.        message being output.
  1163.  
  1164.       "no prototype defined on called function %s",
  1165.        This occurs if  the function  has been earlier defined
  1166.        via a  K&R definition,  and there is no ANSI prototype
  1167.        in scope.
  1168.  
  1169.       "variable/function '%s' not used"
  1170.        There is a  variable and/or    function  that    has  been
  1171.        declared but not used.
  1172.  
  1173.        This check is  done at  the end  of a  function/block.
  1174.        This means  that  for  a  variable,    the  line  number
  1175.        quoted with    this message is that for the start of the
  1176.        next function/block    after the  one that  defines  the
  1177.        unused variable.    For a  function, the  line  number
  1178.        quoted will    typically correspond  to the  end of  the
  1179.        source file.
  1180.  
  1181.  
  1182.       LEVEL 6
  1183.  
  1184.       The warnings  that occur    at this  level are  not  normally
  1185.       relevant to the average user.
  1186.  
  1187.       "a cast changed an integer constant (%08lx->%08lx)"
  1188.        This indicates  that  an  implicit  cast  changed  the
  1189.        constant as    stated in  such a  way    that  significant
  1190.        bits may have been lost.
  1191.  
  1192.       "a cast to a narrower type loses accuracy"
  1193.        This is really not  a problem  if the  action is  what
  1194.        was intended.
  1195.  
  1196.        The purpose    of   this   warning   is   to    highlight
  1197.        situations  in   which  there   may    be   an  implicit
  1198.        assumption built  into the  code as    to the    size of a
  1199.        field of  a particular  type, which may not be true on
  1200.        the current machine.
  1201.  
  1202.       "partially elided braces on initialisation"
  1203.        This rather    cryptic   message  can     be  output  when
  1204.        initialising unions,  arrays and  structures.   The    C
  1205.        standard  says   that  initialisers     for   all   such
  1206.        constructs should  ideally have  braces  around  them.
  1207.        This message  therefore means  that the  bounds  of    a
  1208.        particular element  of the  data structre  had  to  be
  1209.        deduced from  its position  in the initialisation list
  1210.        rather than being explicitly bounded by braces.
  1211.  
  1212.        The requirement to  suppress this  message is that the
  1213.        values for  an union,  array or  structure must  start
  1214.        and end  with braces.    In the  case of  more complex
  1215.        structures such  as an  array of structures there must
  1216.        ne braces  around the  whole set  of  values  (ie  the
  1217.        array) and  also braces  around the    values    for  each
  1218.        occurence of the structure.
  1219.  
  1220.       "pointer difference cast to 16-bits"
  1221.        Pointers in c386/c68  are 32  bit values,  so  if  the
  1222.        result of  subtracting them    is stored  in  a  16  bit
  1223.        variable then the value might be truncated.
  1224.  
  1225.        This is most  likely  to  be  a  problem  if  you  are
  1226.        treating  'int's   as  16   bit  values.    In   other
  1227.        situations  it   is    likely    that  the  program  logic
  1228.        ensures that  the results  cannot be  larger than a 16
  1229.        bit value.
  1230.  
  1231.       LEVEL 7
  1232.  
  1233.       The warnings  that occur    at this  level are  not  normally
  1234.       relevant to  the average    user.  They are extremly pedantic
  1235.       in nature  and are  normally onky realy relevant to tidying
  1236.       up the code.
  1237.  
  1238.       "initialisation incomplete - remaining fields zeroed"
  1239.        This message   is   output    if   the   initialisation
  1240.        statement  supplied     for  a   data    item   would  not
  1241.        initialise all elements of that item.
  1242.  
  1243.        There are often  times when    this is  exactly what the
  1244.        programmer meant  to do, but occasionally it is due to
  1245.        the initialisation being incomplete.
  1246.  
  1247.       "unnecessary cast to 'void'"
  1248.        This is  when a  void expression is explicitly cast to    a
  1249.        void.  This is a null operation, so you do not need to
  1250.        specify the void.
  1251.  
  1252.  
  1253.       CODE GENERATOR WARNINGS
  1254.  
  1255.       The following  warning messages  can be  output by the code
  1256.       generator part  of C68/C386.  They are output regardless of
  1257.       the warning level specified.
  1258.  
  1259.       These messages  are not  intended  to  be  of  use  to  the
  1260.       average  user,   but  are   instead   diagnostic     messages
  1261.       indicating that  internal consistency  checks have  failed.
  1262.       In theory  the situations  that cause  them  to  be  output
  1263.       should have  been detected  in the  parsing  stage  of  the
  1264.       compiler.  They  thus  may  well indicate a problem earlier
  1265.       in the  compiler.  If  you suspect  this is  the case, then
  1266.       please submit  an error  report    (see  also  the  comments
  1267.       earlier under the "general errror" warning message).
  1268.  
  1269.       "changing integer constant on output (%08lx->%08lx)"
  1270.  
  1271.       "division by zero in constant node"
  1272.       This  indicates    that  while  c386/c68  was  evaluating    a
  1273.       constant    expression,   a  division   by    zero   has   been
  1274.       encountered.
  1275.  
  1276.       "illegal operation in dooper %s"
  1277.       This indicates  an internally detected error while handling
  1278.       the specified operation.
  1279.  
  1280.       "non-positive shift constant"
  1281.  
  1282.       "shift constant out of range"
  1283.       The value  of the  shift constant  is  so  large    that  the
  1284.       answer will always be zero
  1285.  
  1286.  
  1287. AUTHOR(s)
  1288.  
  1289.       Versions prior to release 4.0:
  1290.        Christoph van Wullen.
  1291.  
  1292.       ANSIfication work  and other  enhancements in  Release  4.0
  1293.       and later releases:
  1294.  
  1295.        Keith Walker
  1296.         email: kdw@oasis.icl.co.uk
  1297.         (bug fixes, IEEE support, ANSIfication)
  1298.        Dave Walker
  1299.         email: d.j.walker@slh0101.wins.icl.co.uk
  1300.         (IEEE support, Errors/Warnings, documentation)
  1301.  
  1302.       Port to Atari ST (TOS version):
  1303.  
  1304.        Thorsten Roskowetz
  1305.         email: rossi@titan.rz.uni-osnabrueck.de
  1306.  
  1307.  
  1308. SEE ALSO
  1309.  
  1310.       cc68x(1), cpp(1), as68(1), ld(1)
  1311.  
  1312.